<?php

/**
 * FornecedorController
 * 
 * @author Voitech
 * @version 1.0
 */
class FornecedorController extends Zend_Controller_Action {
	public function init(){
            parent::init();
            $this->view->tituloPagina = "Controle de Fornecedor";
        }
	/**
	 * The default action - show the home page
	 */
	public function indexAction() {
		$form = new App_Form_Pesquisa();
                $form->montaTipoBusca(array('no_fornecedor'=>'Razão Social'
                						   ,'co_fornecedor'=>'Cód. Fornecedor'
                                           ,'nu_cnpj'=>'cnpj'));
                $form->setSituacao();
		$form->setAction('javascript:;');
                $form->show();
		$this->view->form = $form;
	}
	
	/**
	 * Metodo que lista os fornecedores
	 * 
	 * @access 	public
	 * @param 	co_fornecedor
	 * @param 	no_fornecedor
	 * @param 	nu_cnpj
	 * @param 	st_ativo
	 * @return 	zend_paginator
	 */
	public function listarAction(){
		$this->_helper->layout->disableLayout();			
		try {
			if ($this->getRequest()->isPost()) {				  
                            $arrParam = array($this->_getParam('tipo_busca') => $this->_getParam('palavra_chave')
                                             ,'st_ativo'=>$this->_getParam('st_ativo'));
                            $obRepository = new App_Model_FornecedorRepository();                            
                            $paginator = new Voitech_Paginator($obRepository->listarTodos($arrParam),$this->_getParam( 'list' ),$this->_getParam('page'));		       					    	
                            $this->view->paginator	= $paginator->paginar(10);
                            $this->view->div_id 	= 'div_listar_fornecedor';
                            $this->view->dataType 	= "post";
                            $this->view->frmName	= "frmPesquisar";       
			}			
		}catch (Voitech_ExceptionValidate $e) {
			echo $this->_helper->json(array('resultado'=>ERRO_VALIDACAO,'retorno'=>'Favor preencher corretamente os dados obrigatórios'));
		}catch (Voitech_Exception $e) {
			echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
		}catch (Exception $e) {
			echo $this->_helper->json(array('resultado'=>ERROR_GERAL,'retorno'=>$e->getMessage()));
		}			
	}
	
	/**
	 * Metodo que monta o formulario de fornecedor
	 * 
	 * @param 	id
	 * @return 	zend_form
	 */
	public function cadastroAction() {
            $this->_helper->layout->disableLayout();
            $form = new App_Form_Fornecedor();
            $form->setAction('javascript:;');
            if( $this->_getParam('id') != '')
            {
                    $where = App_Model_Db_Fornecedor::build()->getAdapter()->quoteInto('co_fornecedor = ?', $this->_getParam('id'));			
                    $obFornecedor = App_Model_Db_Fornecedor::build()->fetchRow($where);
                    if( !empty($obFornecedor) )
                    {
                        $form->populate($obFornecedor->toArray());	
                    }			
            }
            $this->view->form = $form;
	}
	
	/**
	 * Metodo que salva o fornecedor
	 * 
	 * @param 	co_fornecedor
	 * @param 	no_fornecedor
	 * @param 	nu_cnpj
	 * @param 	nu_inscricao
	 * @return 	json (resultado,retorno)
	 */
	public function salvarCadastroAction(){
		$this->_helper->layout->disableLayout();
		$this->_helper->viewRenderer->setNoRender();
		$form = new App_Form_Fornecedor();		
		try {
                    App_Model_Db_Fornecedor::build()->getAdapter()->beginTransaction();

                    if(!$form->isValid($this->_getAllParams()))
                    {
                            throw new Voitech_ExceptionValidate('erro_validacao');				
                    }				
                    $obFornecedor = new App_Model_Fornecedor();
                    $obFornecedor->setCoFornecedor($this->_getParam('co_fornecedor'));
                    $obFornecedor->setNoFornecedor($this->_getParam('no_fornecedor'));
                    $obFornecedor->setNuCnpj($this->_getParam('nu_cnpj'));
                    $obFornecedor->setNuInscricao($this->_getParam('nu_inscricao'));
                    $obFornecedor->setDsEndereco($this->_getParam('ds_endereco'));
                    $obFornecedor->setNuTelefone($this->_getParam('nu_telefone'));
                    
                    $obRepresentante = new App_Model_Representante();
                    $obRepresentante->setCoPessoa($this->_getParam('co_representante'));
                    
                    $obFornecedor->setObRepresentante($obRepresentante);
                    
                    $obFornecedor->setObUsuarioCadastro(new App_Model_Usuario($this->view->user->getCoPessoa()));               

                    $obFornecedorRepository = new App_Model_FornecedorRepository();
                    $obFornecedorRepository->salvar($obFornecedor);
                    App_Model_Db_Fornecedor::build()->getAdapter()->commit();
                    echo $this->_helper->json(array('resultado'=>OK,'retorno'=>'Registro salvo com sucesso!.'));							
		}catch (Voitech_ExceptionValidate $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERRO_VALIDACAO,'retorno'=>'Favor preencher corretamente os dados obrigatórios'));
		}catch (Voitech_Exception $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
		}catch (Exception $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERRO_GERAL,'retorno'=>'Erro ao alterar registro.'));
		}		
	}
	
	/**
	 * Metodo que altera o status do fornecedor
	 * 
	 * @param 	co_fornecedor
	 * @param 	st_ativo
	 * @return 	json resultado,retorno
	 */
	public function alterarStatusAction() {
		$this->_helper->layout->disableLayout();
		$this->_helper->viewRenderer->setNoRender();
		try {
			App_Model_Db_Fornecedor::build()->getAdapter()->beginTransaction();                        
                        $obFornecedorRepository = new App_Model_FornecedorRepository();                        
                        if( $this->_getParam("st_ativo") == "S") {
                            $obFornecedorRepository->ativar(new App_Model_Fornecedor($this->_getParam('co_fornecedor')));
                        }
                        else
                        {
                            $obFornecedorRepository->desativar(new App_Model_Fornecedor($this->_getParam('co_fornecedor')));
                        }
			App_Model_Db_Fornecedor::build()->getAdapter()->commit();
			echo $this->_helper->json(array('resultado'=>OK,'retorno'=>'Registro alterado com sucesso!.'));				
		
		}catch (Voitech_ExceptionValidate $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERRO_VALIDACAO,'retorno'=>'Favor preencher corretamente os dados obrigatórios'));
		}catch (Voitech_Exception $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
		}catch (Exception $e) {
			App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
			echo $this->_helper->json(array('resultado'=>ERROR_GERAL,'retorno'=>$e->getMessage()));
		}		
	}
        
        /**
         * Buscar dados do fornecedor por id
         * 
         * @param   co_fornecedor
         * @return  json
         */
        public function buscarFornecedorJsonAction(){
            $this->_helper->layout->disableLayout();
            $this->_helper->viewRenderer->setNoRender();
            try{
                $obFornecedor = new App_Model_Fornecedor();
                $obFornecedor->setCoFornecedor($this->_getParam('id'));
                $obFornecedorMapper = new App_Model_FornecedorMapper($obFornecedor);
                $obFornecedorMapper->buscarPorId();
                echo $this->_helper->json(array('resultado'=>OK,'retorno'=>array('fornecedor'=>$obFornecedorMapper->retornarArrayPopulado()
                                                                                ,'representante'=>array('no_pessoa'=>$obFornecedorMapper->getObModel()
                                                                                                                     ->getObRepresentante()->getNoPessoa()))));
            }catch (Voitech_Exception $e) {
                    echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
            }catch (Exception $e) {
                    Voitech_Log::gerarLog($e->getMessage());
                    echo $this->_helper->json(array('resultado'=>ERROR_GERAL,'retorno'=>'Ops, ocorreu um erro'));
            }
        }
        
        /**
         * Metodo que lista os fornecedores ativos e retorna json
         * 
         * @return json
         */
        public function listarFornecedorAtivoJsonAction(){
            $this->_helper->layout->disableLayout();
            $this->_helper->viewRenderer->setNoRender();
            try{
                $obFornecedorRepository = new App_Model_FornecedorRepository();
                $arObFornecedor = $obFornecedorRepository->listarTodos(array('st_ativo'=>'S'));
                echo $this->_helper->json(array('resultado'=>OK,'retorno'=>Voitech_Util::converteModeloArrayCombo($arObFornecedor, 'CoFornecedor', "NoFornecedor",1)));
            }catch(Voitech_Exception $e){
                echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
            }catch(Exception $e){
                Voitech_Log::gerarLog($e->getMessage());
                echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>ERROR_GERAL));
            }
        
        }
        
        public function formularioRepresentanteAction(){
            $this->_helper->layout->disableLayout();
            $form = new App_Form_Fornecedor();
            $form->setAction('javascript:;');
            if( $this->_getParam('id') != '')
            {
                    $where = App_Model_Db_Pessoa::build()->getAdapter()->quoteInto('co_pessoa = ?', $this->_getParam('id'));			
                    $obRepresentante = App_Model_Db_Pessoa::build()->fetchRow($where);
                    if( !empty($obRepresentante) )
                    {
                        $form->populate($obRepresentante->toArray());	
                    }			
            }
            $this->view->form = $form;
        }
        
		/**
		 * Metodo apaga registro de Fornecedor
		 * 
		 * @param 	co_Fornecedor
		 * @return 	json resultado,retorno
		 */
		public function excluirAction() {
	            $this->_helper->layout->disableLayout();
	            $this->_helper->viewRenderer->setNoRender();
	            try {
	                App_Model_Db_Fornecedor::build()->getAdapter()->beginTransaction();                        
	                $obFornecedorRepository = new App_Model_FornecedorRepository();                        
	
	                $obFornecedorRepository->excluir(new App_Model_Fornecedor($this->_getParam('co_fornecedor')));
	                
	                App_Model_Db_Fornecedor::build()->getAdapter()->commit();
	                echo $this->_helper->json(array('resultado'=>OK,'retorno'=>'Registro excluido com sucesso!.'));				
	
	            }catch (Voitech_ExceptionValidate $e) {
	                App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
	                echo $this->_helper->json(array('resultado'=>ERRO_VALIDACAO,'retorno'=>$form->getErrors()));
	            }catch (Voitech_Exception $e) {
	                App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
	                echo $this->_helper->json(array('resultado'=>ERRO,'retorno'=>$e->getMessage()));
	            }catch (Exception $e) {
	                App_Model_Db_Fornecedor::build()->getAdapter()->rollBack();
	                Voitech_Log::gerarLog($e->getMessage());
	                echo $this->_helper->json(array('resultado'=>ERROR_GERAL,'retorno'=>$e->getMessage()));
	            }		
		}                
        
        
}

